1、 原子操作
	原子操作是指整个操作过程不可被或者不会被打断，在 ARMV6 及以下架构中采用关中断实现，在 ARMV6 以上架构中采
用 ldrex 和 strex 指令实现，如下是采用 ldrex 和 strex 指令实现的 atomic_add 函数：
	static inline void atomic_add(int i, atomic_t *v)
	{
		unsigned long tmp;
		int result;
	
		__asm__ __volatile__("@ atomic_add\n"
	"1:	ldrex	%0, [%3]\n"										//采用排他性加载 v->counter
	"	 add	%0, %0, %4\n"
	"	strex	%1, %0, [%3]\n"									//采用排他性写入 v->counter
	"	teq	%1, #0\n"											//检查加载是否成功，如果失败则重新执行一次
	"	bne	1b"
		: "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
		: "r" (&v->counter), "Ir" (i)
		: "cc");
	}
2、 原子变量
	原子变量API：
		//静态初始化原子变量
		ATOMIC_INIT(int i)	
		//读取 v 的值，并且返回
		int atomic_read(atomic_t *v) 
		//向 v 写入 i 值
		void atomic_set(atomic_t *v, int i)
		//给 v 加上 i 值
		void atomic_add(int i, atomic_t *v)
		//从 v 减去 i 值
		void atomic_sub(int i, atomic_t *v)
		//给 v 加 1，也就是自增
		void atomic_inc(atomic_t *v)
		//从 v 减 1，也就是自减
		void atomic_dec(atomic_t *v)
		//从 v 减 1，并且返回 v 的值
		int atomic_dec_return(atomic_t *v)
		//给 v 加 1，并且返回 v 的值
		int atomic_inc_return(atomic_t *v)
		//从 v 减 i，如果结果为 0 就返回真，否则返回假
		int atomic_sub_and_test(int i, atomic_t *v)
		//从 v 减 1，如果结果为 0 就返回真，否则返回假
		int atomic_dec_and_test(atomic_t *v)
		//给 v 加 1，如果结果为 0 就返回真，否则返回假
		int atomic_inc_and_test(atomic_t *v)
		//给 v 加 i，如果结果为负就返回真，否则返回假
		int atomic_add_negative(int i, atomic_t *v)
3、 原子位
	原子位API：
		//设置(*p)的第bit位为1
		void set_bit(unsigned int bit, volatile unsigned long *p)
		//清除(*p)的第bit位
		void clear_bit(unsigned int bit, volatile unsigned long *p)
		//改变(*p)的第bit位，从1变为0，或是从0变为1
		void change_bit(unsigned int bit, volatile unsigned long *p)
		//设置(*p)的第bit位为1，并返回该位的老值
		int test_and_set_bit(unsigned int bit, volatile unsigned long *p)
		//清除(*p)的第bit位，并返回该位的老值
		int test_and_clear_bit(unsigned int bit, volatile unsigned long *p)
		//改变(*p)的第bit位，从1变为0，或是从0变为1；并返回该位的老值
		int test_and_change_bit(unsigned int bit, volatile unsigned long *p)
